Tutorial Study Image

C++ 模板


2023 年 6 月 12 日, Learn eTutorial
673

在 C++ 中,模板似乎是一个非常简单但极其强大的工具。基本思想是将数据类型作为参数传递,从而无需为不同的数据类型编写相同的代码。C++ 模板是 C++ 中增加的一个有用功能。它允许您定义通用类和通用函数,并支持泛型编程。借助通用类型,算法可以以一种与各种数据类型兼容的方式编写。这被称为泛型编程。

在 C++ 中,模板被描述为开发通用类或函数的设计模式或蓝图。为了使算法适用于各种数据类型,泛型编程使用通用类型作为参数。在 C++ 中,模板是一个简单而强大的工具。直接的想法是提供数据类型作为参数,以避免为几种数据类型编写相同代码的必要性。

函数模板是与通用类型通信的独特函数。因此,我们能够创建一个函数模板,其功能可以应用于多种类型或类,而无需为每种类型单独编写整个代码。在 C++ 中,可以使用模板参数来完成此操作。与使用常规函数参数将值传递给函数类似,也可以使用模板参数将类型传递给函数。模板参数是一种参数,可用于传递任何类型的参数。这些函数模板可以像任何其他常规类型一样使用这些参数。

因此,本教程旨在帮助您学习 C++ 中模板的详细信息,例如它们的功能、模板特化、模板库等。要了解更多信息,请继续阅读!

C++ 中的模板:它们是什么?

C++ 中的模板是开发通用类或函数的蓝图或公式,这是一个令人兴奋的功能,主要用于泛型编程。简而言之,使用模板可以构建一个可以处理多种数据类型的单个函数或单个类。

C++ 模板是一个非常强大的 C++ 功能,通常被称为泛型函数或类。对于 C++ 中的模板语法,使用“template”一词,以及参数 (t) 中的尖括号,这表示数据类型变量。

C++ 模板如何运作?

与宏类似,C++ 中的模板在编译时展开,使得函数或类可以处理多种数据类型,而无需完全重写。这意味着模板展开主要发生在编译期间。它与宏非常相似。不同之处在于,在展开模板之前,编译器会执行类型检查。这个概念很简单:源代码只包含一个函数或类,而生成的代码可能包含相同函数或类的多个副本。

有两种表示模板的方法

  • 函数模板:对于一个函数,我们可以指定一个模板。例如,如果我们已经有 add() 函数,我们可以修改它以添加 int、float 或 double 类型的值。
  • 类模板:可以定义一个类的模板。例如,可以开发一个数组类模板,它可以接受不同类型的数组,例如 int 数组、float 数组或 double 数组。

函数模板

  • 函数模板的思想被通用函数使用。通用函数定义了一组可以对不同类型数据进行操作的运算。
  • 根据作为参数提供的数据类型,函数操作该数据的能力将有所不同。
  • 例如,可以使用通用函数创建一个浮点数或整数数组的快速排序算法。
  • 使用关键字 template 可以创建通用函数。模板指定函数将执行什么操作。

函数模板:语法


template < class Ttype> ret_type func_name(parameter_list)  
{  
   // body of function.  
}  
 

其中 Ttype:Ttype 是函数将用作占位符的数据类型的名称。它在函数定义中使用。它只是一个占位符;编译器将使用实际数据类型代替它。

Class:在模板声明中,通用类型使用 class 关键字指定。

让我们看一个函数模板的例子


#include <iostream>  
using namespace std;  
template<class T> T add(T &a,T &b)  
{  
    T result = a+b;  
    return result;  
      
}  
int main()  
{  
  int i =5;  
  int j =6;  
  float m = 5.6;  
  float n = 1.2;  
  cout<<" The addition of i and j :"<<add(i,j);  
  cout<<'\n';  
  cout<<"The addition of m and n  :"<<add(m,n);  
  return 0;  
}  

 

输出


The addition of i and j :11
The addition of m and n  :6.8

在上面的例子中,我们开发了一个函数模板,它可以添加任何类型的数据,包括 double、float 或 integer。

具有多个参数的函数模板

通过用逗号分隔列表,我们可以在模板函数中使用多个通用类型。

语法


template<class T1, class T2,.....> 
return_type function_name (arguments of type T1, T2....)  
{  
    // body of function.  
}  
 

如上所示,模板函数可以接受任意数量的不同类型的参数。

该程序展示了具有多个参数的函数模板


#include <iostream> 
using namespace std;  
template<class X,class Y> void fun(X a,Y b)  
{  
    std::cout << "The Value of a : " <<a<< std::endl;  
    std::cout << "The Value of b: " <<b<< std::endl;  
}  
  
int main()  
{  
   fun(16,14.3);  
   
   return 0;  
}  
 

输出


The Value of a : 16
The Value of b: 14.3

在上面示例的模板函数中,使用了两个通用类型 X 和 Y。

类模板

与函数模板类似,类模板也可以定义。当一个类采用模板的概念时,它被称为泛型类。

语法


template  
class class_name  
 {  
    .  
    .  
  }  

 

Ttype 是一个占位符名称,将在创建类时分配。一个逗号分隔的列表允许我们声明许多通用数据类型。类体可以使用 Ttype。

现在我们将创建一个类的实例。

class_name<type> ob;

其中 class_name:这是类的名称。

type:此术语表示类正在处理的数据类型。

ob: 这是对象的名称。

类模板的示例程序


#include <iostream>  
using namespace std;  
template<class T>  
class A   
{  
    public:  
    T num1 = 5;  
    T num2 = 5;  
    void add()  
    {  
        std::cout << "Addition of num1 and num2 : " << num1+num2<<std::endl;  
    }  
      
};  
  
int main()  
{  
    A<int> d;  
    d.add();  
    return 0;  
}  

 

输出


Addition of num1 and num2 : 10

在上面的示例中,我们为类 A 开发了一个模板。我们在 main() 方法中创建了类 A 的一个实例,名为“d”。

什么是模板,它提供哪些好处?

借助 C++ 模板,您可以开发一组可以管理各种数据类型的类或函数。当需要跨多种类型重用相同的代码时,我们使用模板。以下是使用模板的一些好处

  • 与 STL 结合使用时,它们通过减少开发时间来提高程序效率。
  • 它们支持类型的泛化。
  • 它们减少了需要输入的重复代码量。
  • 它们支持创建类型安全的代码。
  • 它们在编译时进行评估。
  • 它们促进了极其强大的库的创建。